/*
 * Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
package javax.swing;

import java.awt.*;
import java.awt.image.*;

/**
 * An image filter that "disables" an image by turning
 * it into a grayscale image, and brightening the pixels
 * in the image. Used by buttons to create an image for
 * a disabled button.
 *
 * @author Jeff Dinkins
 * @author Tom Ball
 * @author Jim Graham
 */
public class GrayFilter extends RGBImageFilter {

  private boolean brighter;
  private int percent;

  /**
   * Creates a disabled image
   */
  public static Image createDisabledImage(Image i) {
    GrayFilter filter = new GrayFilter(true, 50);
    ImageProducer prod = new FilteredImageSource(i.getSource(), filter);
    Image grayImage = Toolkit.getDefaultToolkit().createImage(prod);
    return grayImage;
  }

  /**
   * Constructs a GrayFilter object that filters a color image to a
   * grayscale image. Used by buttons to create disabled ("grayed out")
   * button images.
   *
   * @param b a boolean -- true if the pixels should be brightened
   * @param p an int in the range 0..100 that determines the percentage of gray, where 100 is the
   * darkest gray, and 0 is the lightest
   */
  public GrayFilter(boolean b, int p) {
    brighter = b;
    percent = p;

    // canFilterIndexColorModel indicates whether or not it is acceptable
    // to apply the color filtering of the filterRGB method to the color
    // table entries of an IndexColorModel object in lieu of pixel by pixel
    // filtering.
    canFilterIndexColorModel = true;
  }

  /**
   * Overrides <code>RGBImageFilter.filterRGB</code>.
   */
  public int filterRGB(int x, int y, int rgb) {
    // Use NTSC conversion formula.
    int gray = (int) ((0.30 * ((rgb >> 16) & 0xff) +
        0.59 * ((rgb >> 8) & 0xff) +
        0.11 * (rgb & 0xff)) / 3);

    if (brighter) {
      gray = (255 - ((255 - gray) * (100 - percent) / 100));
    } else {
      gray = (gray * (100 - percent) / 100);
    }

    if (gray < 0) {
      gray = 0;
    }
    if (gray > 255) {
      gray = 255;
    }
    return (rgb & 0xff000000) | (gray << 16) | (gray << 8) | (gray << 0);
  }
}
